<?php


//namespace 你的命名空间;
/**
 * 使用
 * Cache::set(key,value,time)
 * Cache::get(key)
 * Cache::delete(key)
 * Cache::flush(key)
 * Cache::has(key)
 * 
 * 在指定的目录下生成 $key.cache 文件，为缓存数据文件
 */

class Cache
{
    static private $path='文件缓存目录'; 
    static private $instance;
    static public function getInstance(){
        if(!self::$instance instanceof self){
            self::$instance=new self;
        }
        return self::$instance;
    }

    /**
     * 设置缓存
     * @param $key  key
     * @param $value  value
     * @param int $time 秒
     * @return bool
     */
    static public function set($key,$value,$time=0){
        $file=static::$path.DIRECTORY_SEPARATOR.$key.'.cache';
        if(!is_dir(static::$path)){
            $mode=intval('0777',8);
            mkdir(static::$path, $mode, true);
        }
        $data=[
            'time'=>$time? time() + $time : 0,
            'data'=>$value,
            'key'=>$key
        ];
        $data=json_encode($data,JSON_UNESCAPED_UNICODE);
        $rs=file_put_contents($file,$data);
        if($rs){
            return true;
        }
        return false;
    }

    /**
     * 获取缓存
     * @param $key
     * @return null
     */
    static public function get($key){
        $file=static::$path.DIRECTORY_SEPARATOR.$key.'.cache';
        if(!file_exists($file)){
            return null;
        }
        $fp = fopen($file,"r");
        $dataStr = fread($fp,filesize($file));
        if (!$dataStr) {
            fclose($fp);
            return null;
        }
        $array = json_decode($dataStr, true);
        if (empty($array['data'])) {
            fclose($fp);
            return null;
        }
        if($array['time']){
            if($array['time']>time()){
                $result_data = $array['data'];
            }else{
                fclose($fp);
                static::delete($key);
                return null;
            }
        }else{
            $result_data = $array['data'];
        }
        fclose($fp);
        return $result_data;
    }

    /**
     * 删除缓存
     * @param $key
     * @return bool
     */
   static public function delete($key){
       $file=static::$path.DIRECTORY_SEPARATOR.$key.'.cache';
       if(!file_exists($file)){
           return true;
       }
       unlink($file);
       if(static::get($key)){
           self::delete($key);
       }else{
           return true;
       }
   }

    /**
     * 获取后删除
     * @param $key
     * @return null
     */
   static public function flush($key){
       $rs=static::get($key);
       static::delete($key);
       return $rs;
   }

    /**
     * 判断缓存是否存在
     * @param $key
     * @return bool
     */
   static public function has($key){
       $rs=static::get($key);
       if($rs){
           return true;
       }
       return false;
   }

}